#include <iostream>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
using std::cout;
using std::endl;
using namespace log4cpp;

void test(){
    OstreamAppender *ap1 = new OstreamAppender("console", &cout);
    PatternLayout * pl = new PatternLayout();
    //%d表示的是时间，默认的格式基本够用
    //%c表示的是category的信息
    //%p是优先级，比如INFO、DEBUG等
    //%m用户输入的原始日志信息
    //%n换行符
    pl->setConversionPattern("%d %c [%p] %m%n");
    ap1->setLayout(pl);

    Category & root = Category::getRoot();
    root.setPriority(Priority::INFO);
    root.setAppender(ap1);
    root.debug("this is a debug message");
    root.info("this is an info message");
    root.alert("alert");
}
//如果当前日志系统中有多个输出的目的地
//这多个目的地输出的日志的格式都要求是格式化输出的模式
//如果有多个目的地，千万不可以多个目的地关联同一个日志layout指针
//为什么呢？主要原因在于PatternLayout使用了new操作
//后续肯定会有delete操作
//此时多个目的地关联的是同一个pl
//可能在多个目的地中都去执行了析构函数的回收操作
void test2(){
    OstreamAppender *ap1 = new OstreamAppender("console", &cout);
    FileAppender * ap2 = new FileAppender("file", "layout.txt");
    PatternLayout * pl = new PatternLayout();
    PatternLayout * pl2= new PatternLayout();
    //%d表示的是时间，默认的格式基本够用
    //%c表示的是category的信息
    //%p是优先级，比如INFO、DEBUG等
    //%m用户输入的原始日志信息
    //%n换行符
    pl->setConversionPattern("%d %c [%p] %m%n");
    pl2->setConversionPattern("%d %c [%p] %m%n");
    ap1->setLayout(pl);
    ap2->setLayout(pl2);
    Category & root = Category::getRoot();
    root.setPriority(Priority::INFO);
    //root.setAppender(ap1);
    root.addAppender(ap1);
    root.addAppender(ap2);
    root.debug("this is a debug message");
    root.info("this is an info message");
    root.alert("alert");
}

int main()
{
    test2();
    return 0;
}

